"""
项目对象，支持点号访问分类和项目属性
"""
from typing import Dict, Any, Optional

from .category import ParameterCategory


class Project:
    """项目对象，支持点号访问分类和项目属性"""
    
    def __init__(self, project_data: Dict[str, Any], categories_data: Dict[str, Any]):
        self._data = project_data
        self._categories = {}
        self._client = None  # 用于new_experiment方法
        
        # 创建分类对象
        for category_name, category_data in categories_data.items():
            self._categories[category_name] = ParameterCategory(category_data)
    
    @property
    def name(self):
        """项目中文名称"""
        return self._data.get('name')
    
    @property
    def name_en(self):
        """项目英文名称"""
        return self._data.get('name_en')
    
    @property
    def description(self):
        """项目描述"""
        return self._data.get('description')
    
    @property
    def id(self):
        """项目ID"""
        return self._data.get('id')
    
    @property
    def time_horizon(self):
        """时间长度"""
        return self._data.get('time_horizon')
    
    @property
    def start_year(self):
        """起始年份"""
        return self._data.get('start_year')
    
    @property
    def year_step(self):
        """年份步长"""
        return self._data.get('year_step')
    
    @property
    def end_year(self):
        """结束年份"""
        return self._data.get('end_year')
    
    @property
    def created_at(self):
        """创建时间"""
        return self._data.get('created_at')
    
    @property
    def updated_at(self):
        """更新时间"""
        return self._data.get('updated_at')
    
    @property
    def categories(self):
        """参数分类列表"""
        return list(self._categories.keys())
    
    def __getattr__(self, name):
        """支持点号访问分类"""
        if name in self._categories:
            return self._categories[name]
        raise AttributeError(f"项目 '{self.name_en}' 中没有分类 '{name}'")
    
    def __dir__(self):
        """支持dir()函数，显示可用属性"""
        return list(self._categories.keys()) + [
            'name', 'name_en', 'description', 'id', 'time_horizon', 
            'start_year', 'year_step', 'end_year', 'created_at', 'updated_at', 'categories'
        ]
    
    def __str__(self):
        return f"Project(name='{self.name_en}', categories={list(self._categories.keys())})"
    
    def __repr__(self):
        return self.__str__()
    
    def get_category(self, name: str) -> ParameterCategory:
        """获取指定分类"""
        if name not in self._categories:
            raise KeyError(f"分类 '{name}' 不存在")
        return self._categories[name]
    
    def list_categories(self):
        """列出所有分类名称"""
        return list(self._categories.keys())
    
    def __iter__(self):
        """支持迭代，返回所有分类名称"""
        return iter(self._categories.keys())
    
    def __getitem__(self, category_name: str) -> ParameterCategory:
        """支持中括号访问分类对象"""
        if category_name not in self._categories:
            raise KeyError(f"分类 '{category_name}' 不存在")
        return self._categories[category_name]
    
    def new_experiment(self, name: Optional[str] = None, description: Optional[str] = None):
        """
        创建新的实验收集器（通过关联的client）
        
        Args:
            name: 实验名称（可选，默认自动生成）
            description: 实验描述（可选）
            
        Returns:
            ExperimentCollector实例
        """
        if not self._client:
            raise ValueError("Project对象未关联client，无法创建实验。请使用client.new_experiment()")
        
        from ..experiment_collector import ExperimentCollector
        return ExperimentCollector(self._client, name=name, description=description)

